import scrapy
# 模板类定义以后需要在爬虫中导入并且实例化,之后的使用方法和使用字典相同
from itcast.items import ItcastItem


# 编写指定网站的数据采集操作,实现数据提取
# 在scrapy中 scrapy.Spider类是所有爬虫类的基类(父类)
class TeacherSpider(scrapy.Spider):
    # 爬虫的名字  (启动爬虫的时候需要使用到这个名字)
    name = 'teacher'
    # 爬虫允许爬取域名范围
    allowed_domains = ['itcast.cn']
    # 起始页的url地址
    start_urls = ['http://www.itcast.cn/channel/teacher.shtml']

    # 解析起始页url地址对应的响应方法,这个方法必须有 必须叫做parse
    # response 起始页url地址对应的响应对象
    def parse(self, response):
        """
        1.定位元素以及提取数据、属性值的方法:
            response.xpath方法的返回结果是一个类似list的类型，其中包含的是selector对象，操作和列表一样，但是有一些额外的方法
            额外方法extract()：返回一个包含有字符串的列表
            额外方法extract_first()：返回列表中的第一个字符串，列表为空没有返回None

        2.response响应对象的常用属性:
            response.url：当前响应的url地址
            response.request.url：当前响应对应的请求的url地址
            response.headers：响应头
            response.requests.headers：当前响应的请求头
            response.body：响应体，也就是html代码，byte类型
            response.status：响应状态码
        :param response:
        :return:
        """
        # 1.响应对象response 可以直接调用 xpath()方法
        # names = response.xpath('//div[@class="tea_con"]//li/div/h3/text()').extract()
        # print(names)

        # 将数据先进行分组
        li_list = response.xpath("//div[@class='tea_con']//li")
        # 遍历分组数据，取出一个一个的老师信息
        for li in li_list:
            # item = {}
            item = ItcastItem()
            # 利用scrapy封装好的xpath选择器定位元素,提取出来的数据是一个 selector 对象
            # 通过extract()来获取结果  返回包含数据字符串的列表
            # 或extract_first()来获取结果    返回列表中第一个字符串,当列表为空返回None
            item["name"] = li.xpath(".//h3/text()").extract_first()
            item["level"] = li.xpath(".//h4/text()").extract_first()
            item["text"] = li.xpath(".//p/text()").extract_first()
            # print(item)

            # parse()函数中使用yield返回数据，注意：解析函数中的yield能够传递的对象只能是：BaseItem, Request, dict, None
            # 运行scrapy:
            # 命令：在虚拟环境的项目目录下执行 scrapy crawl <爬虫名字>
            yield item
